Grokking-the-coding-interview

# Given a string, find all of its permutations preserving the character sequence but changing case.

# Example:
# Input: "ad52"
# Output: "ad52", "Ad52", "aD52", "AD52"

# O(N * 2^N) space: O(N * 2^N)
def string_permutation(str):
    permutations = []
    permutations.append(str)
    for i in range(len(str)):
        if str[i].isalpha():
            n = len(permutations)
            for j in range(n):
                character = list(permutations[j])
                character[i] = character[i].swapcase()
                permutations.append(''.join(character))
    
    return permutations

print(string_permutation("ad52"))

def find_letter_case_string_permutations(str):
    result = []
    generate_permutations_recursive(str, 0, [], result)
    return result

def generate_permutations_recursive(str, index, current_permutation, result):
    if index == len(str):
        result.append(''.join(current_permutation))
    else:
        if str[index].isalpha():
            for i in range(2):
                new_permutation = list(current_permutation)
                if i == 0:
                    new_permutation.append(str[index].lower())
                else:
                    new_permutation.append(str[index].upper())
                generate_permutations_recursive(str, index + 1, new_permutation, result)
        else:
            new_permutation = list(current_permutation)
            new_permutation.append(str[index])
            generate_permutations_recursive(str, index + 1, new_permutation, result)

print(find_letter_case_string_permutations("ad52"))